/********************************************************************************

                  AIC ArtInChip Dxx扩展定义

********************************************************************************/
#ifndef __AIC_SOC_EX_H_
#define __AIC_SOC_EX_H_

#include "aic_soc.h"
#include "aic_common.h" //bool u8等定义
#include "core_rv32.h"  //__IM/__OM/__IOM

/********************************************************************************
                              GPIO
********************************************************************************/
//---------------------------------结构定义--------------------------------------
typedef struct{
  //下述每位对应一引脚:
  __IM  uint32_t IN_STA;    //通用输入状态寄存器,0低电平，1高电平
  __IOM uint32_t OUT_CFG;   //通用输出控制寄存器,0输出低电平，1输出高电平
  __IOM uint32_t IRQ_EN;    //通用中断使能寄存器,0关闭，1使能
  __IOM uint32_t IRQ_STA;   //通用中断状态寄存器,0无中断，1有中断，写1清零
  __OM  uint32_t OUT_CLR;   //通用输出清除寄存器 0保持不变，1输出低电平
  __OM  uint32_t OUT_SET;   //通用输出置位寄存器 0保持不变，1输出高电平
  __OM  uint32_t OUT_TOG;   //通用输出反转寄存器 0保持不变，1输出反转电平
  uint32_t RESERVED1[(0x80-7*4)/4]; //PIN_CFG从0x80起
  //下述每一引脚对应一个下标:
  __IOM uint32_t PIN_CFG[32];  //功能配置寄存器,无该引脚时不可访问,具体功能见
                               //aic_gpio_id.h中的pin_func_t定义
}GPIO_TypeDef;

//----------------------------------PIN_CFG位定义---------------------------------------
//引脚功能, 2~15特殊功能可参考aic_gpio_id.h中的pin_func_t定义
#define PIN_FUN_MASK   0x0000000f  
#define PIN_FUN_CLOSE  0x00000000  //关闭,为0
#define PIN_FUN_GPIO   0x00000001  //通用GPIO
//引脚输出驱动能力, 具体位含义见aic_hal_gpio.h中的PIN_DRV_33V_xxxx_xxxx定义
#define PIN_DRV_SHIFT   4
#define PIN_DRV_MASK    ((uint32_t)7 << PIN_DRV_SHIFT) 
//上下拉选择, 具体位含义见aic_hal_gpio.h中的PIN_PULL_xxxx定义
#define PIN_PULL_SHIFT  8
#define PIN_PULL_MASK   ((uint32_t)3 << PIN_PULL_SHIFT) 
#define PIN_PULL_SDOWN   ((uint32_t)2 << PIN_PULL_SHIFT)  //带移位值
#define PIN_PULL_SUP     ((uint32_t)3 << PIN_PULL_SHIFT)  //带移位值
//通用功能中断检测模式，PIN_FUN=1且GEN_IE=1有效,具体位含义见aic_hal_gpio.h中的PIN_IRQ_MODE_xxxx定义
#define PIN_IRQ_MODE_SHIFT  12
#define PIN_IRQ_MODE_MASK   ((uint32_t)7 << PIN_IRQ_MODE_SHIFT) 
//通用功能输入使能，仅在PIN_FUN=1才有效
#define PIN_IN_EN       ((uint32_t)1 << 16) 
//通用功能输出使能，仅在PIN_FUN=1才有效。
#define PIN_OUT_EN      ((uint32_t)1 << 17) 
//专用功能输入强制使能，仅在 PIN_FUN=2~6 才有效，调试使用，强制使能输入并将输入状态存到通用输入状态寄存器
#define PIN_IN_FORCE    ((uint32_t)1 << 18) 
//通用输入第一级去抖采样点数，PIN_FUN=1且GEN_IE=1才有效。
//第一级去抖采样周期为一个 APB0 时钟 (100 MHz) 周期,该配置值为去抖采样点数，配置为 0 则关闭本级去抖。
#define PIN_IN_DB0_POINT_SHIFT  20
#define PIN_IN_DB0_POINT_MASK   ((uint32_t)15 << PIN_IN_DB0_POINT_SHIFT) 
//通用输入第二级去抖采样除频，仅在 PIN_FUN=1 且 GEN_IE=1 才有效。
//第二级去抖采样周期为 2^(SAMP+1) 个 APB0 时钟 (100 MHz) 周期。
#define PIN_IN_DB1_SAMP_SHIFT  24
#define PIN_IN_DB1_SAMP_MASK   ((uint32_t)15 << PIN_IN_DB1_SAMP_SHIFT) 
//通用输入第二级去抖参考点数，仅在 PIN_FUN=1 且 GEN_IE=1 才有效。
//该配置值为去抖采样点数，配置为 0 则关闭本级去抖。
#define PIN_IN_DB01_POINT_SHIFT  28
#define PIN_IN_DB1_POINT_MASK   ((uint32_t)15 << PIN_IN_DB1_POINT_SHIFT) 

//----------------------------------各引脚寄存器位置---------------------------------------
//因GPIOx与aic_gpio_id.h中的定义有冲突，故改为PIO
#define PIOx(x)  ((GPIO_TypeDef *)(GPIO_BASE + 0x100 * (x)))
//12X
#define PIOA			PIOx(0)
#define PIOB			PIOx(1)
#define PIOC			PIOx(2)
#define PIOD			PIOx(3)
#define PIOE			PIOx(4)
//其它系列:
#define PIOF			PIOx(5)
#define PIOG			PIOx(6)
#define PIOH			PIOx(7)
#define PIOI			PIOx(8)
#define PIOJ			PIOx(9)
//其它高端系列:
#define PIOK			PIOx(10)
#define PIOL			PIOx(11)
#define PIOM			PIOx(12)
#define PION			PIOx(13)
#define PIOO			PIOx(14)

/********************************************************************************
                              ADCIM
寄存器位定义与 hal_adcim.c有相同
********************************************************************************/
//---------------------------------结构定义--------------------------------------
typedef struct{
  __IOM  uint32_t MCSR;       //模块控制状态
  __IOM  uint32_t CALCSR;     //校准控制
  __IM   uint32_t FIFOSTS;    //FIFO 状态
  uint32_t RESERVED1[(0xFFC-3*4)/4];
  __IOM uint32_t VERSION;    //模块版本，BCD 码显示，V1.0
}ADCIM_TypeDef;

//实例位置：
#define ADCIM  ((ADCIM_TypeDef *)(ADCIM_BASE))

//----------------------------------位定义---------------------------------------
//MCSR 模块控制状态
#define ADCIM_MSCR_BUSY               ((uint32_t)1 << 16) //忙标志
#define ADCIM_MCSR_SEMFLAG_SHIFT      8     //用户信号量
#define ADCIM_MCSR_SEMFLAG_MASK       ((uint32_t)0xFF << ADCIM_MCSR_SEMFLAG_SHIFT) 
#define ADCIM_MCSR_CHN_MASK           ((uint32_t)15 << ADCIM_MCSR_SEMFLAG_SHIFT) 
//CALCSR 校准控制
#define ADCIM_CALCSR_CALVAL_UPD       ((uint32_t)1 << 31) //ADC 校准值更新
#define ADCIM_CALCSR_CALVAL_SHIFT     16 //ADC 校准输出值
#define ADCIM_CALCSR_CALVAL_MASK      ((uint32_t)0xFFF << ADCIM_CALCSR_CALVAL_SHIFT) 
#define ADCIM_CALCSR_ADC_ACQ_SHIFT    8  //ADC 校准捕获时间
#define ADCIM_CALCSR_ADC_ACQ_MASK     ((uint32_t)0xFF << ADCIM_CALCSR_ADC_ACQ_SHIFT) 
#define ADCIM_CALCSR_DCAL             ((uint32_t)1 << 1) //采样数据校准屏蔽
#define ADCIM_CALCSR_CAL_ENABLE       ((uint32_t)1 << 0) //ADC 校准使能
//FIFOSTS FIFO 状态
#define ADCIM_FIFOSTS_ADC_ARBITER_IDLE ((uint32_t)1 << 6) //ADC仲裁状态： 0接受指令中，1空闲
#define ADCIM_FIFOSTS_FIFO_ERR         ((uint32_t)1 << 5) //FIFO 错误状态：0正常，1上溢或下溢
#define ADCIM_FIFOSTS_CTR_MASK         (uint32_t)0x1f     //FIFO 计数器，指示FIFO 的占用情况
#define ADCIM_FIFOSTS_CTR_MAX          16       //FIFO 计数器最大到16

/********************************************************************************
                              GPAI
寄存器位定义与 hal_gpai.c有相同
********************************************************************************/
//---------------------------------通道结构定义-------------------------------
//通道管理, GPAI有多个此模块(12X有6个此子模块)，
//每个数据结构通过设置指定的通道，来对应GPAI引脚(12X有8个GPIO引脚)
typedef struct{
  __IOM  uint32_t CR;     //通道控制
  __IOM  uint32_t INT;    //通道中断控制与状态
  __IOM  uint32_t PSI;    //通道采样间隔配置
  uint32_t RESERVED1;     //0x0C
  __IOM  uint32_t HLAT;   //高电平报警阈值
  __IOM  uint32_t LLAT;   //低电平报警阈值
  __IOM  uint32_t ACR;    //报警控制
  uint32_t RESERVED2;     //0x1C
  __IOM  uint32_t FCR;    //FIFO控制
  __IOM  uint32_t DATA;   //通道数据
  uint32_t RESERVED3[(0x40-0x28)/4];
}GPAI_CHnTypeDef;

//---------------------------------主结构定义-------------------------------
//通道总数
#ifndef GPAI_CH_COUNT
  #define GPAI_CH_COUNT   6
#endif
typedef struct{
  __IOM  uint32_t MCR;                //模块控制
  __IOM  uint32_t INTR;               //中断控制与状态
  uint32_t RESERVED1[(0x100-2*4)/4];
  GPAI_CHnTypeDef  CHn[GPAI_CH_COUNT]; //通道
  uint32_t RESERVED2[(0xFFC-8-sizeof(GPAI_CHnTypeDef) * GPAI_CH_COUNT)/4];
  __IOM uint32_t VERSION;              //模块版本，BCD 码显示，V1.0
}GPAI_TypeDef;

//实例位置：
#define GPAI  ((GPAI_TypeDef *)(GPAI_BASE))

//----------------------------------位定义---------------------------------------
//(总)MCSR 模块控制
#define GPAI_MSCR_CH_EN_SHIFT    8       //通道使能控制,每位对应一通道
#define GPAI_MSCR_CH_EN_MASK ((((uint32_t)1<<GPAI_CH_COUNT) - 1) << 8)
#define GPAI_MSCR_EN             ((uint32_t)1 << 0) //本模块被使能1,否则停止工作0
//(总)GPAI 中断控制与状态 (GPAI Interrupt Register)
#define GPAI_MSCR_CH_FLG_SHIFT   16     //通道事件更新标志,每位对应一通道
#define GPAI_MSCR_CH_FLG_MASK ((uint32_t)0xff << 16)//每位对应一通道
#define GPAI_MSCR_CH_INTEN_SHIFT   16     //7 中断使能,1使能，每位对应一通道
#define GPAI_MSCR_CH_INTEN_MASK ((uint32_t)0xff)
//GPAI 通道控制 (GPAI Channel N Control Register)
#define GPAI_CHnCR_SBC_SHIFT       24  //采样突发次数,2^SBC次方算术平均后存入FIFO
#define GPAI_CHnCR_SBC_MASK ((uint32_t)0x3 << 24)
#define GPAI_CHnCR_SBC_1_POINTS     0  //1次
#define GPAI_CHnCR_SBC_2_POINTS     1  //2次
#define GPAI_CHnCR_SBC_4_POINTS     2  //4次
#define GPAI_CHnCR_SBC_8_POINTS     3  //8次
#define GPAI_CHnCR_CHN_SHIFT        16  //分配的ADC通道号，硬件据此匹配ADC
#define GPAI_CHnCR_CHN_MASK ((uint32_t)0xF << 16)
#define GPAI_CHnCR_ACQ_SHIFT        8  //捕获时间,单位ADC_CLK,决定采集时间与精度
#define GPAI_CHnCR_ACQ_MASK ((uint32_t)0xFF << 8)
#define GPAI_CHnCR_PRI_HI         ((uint32_t)1 << 4)//采样优先级,0低进队列，1直接处理
#define GPAI_CHnCR_STA_BUSY       ((uint32_t)1 << 2)//通道工作状态,0闲,1忙
#define GPAI_CHnCR_PERIOD_EN      ((uint32_t)1 << 1)//周期采样使能
#define GPAI_CHnCR_SS_EN           ((uint32_t)1 << 0)//单点采样使能,软件置位，硬件完成自清零
//GPAI 通道中断控制与状态 (DMA Channel N Interrupt)
#define GPAI_CHnCR_LLAR_FLG       ((uint32_t)1 << 23)//低电平警报解除标志
#define GPAI_CHnCR_LLAV_FLG       ((uint32_t)1 << 22)//低电平警报有效标志
#define GPAI_CHnCR_HLAR_FLG       ((uint32_t)1 << 21)//高电平警报解除标志
#define GPAI_CHnCR_HLAV_FLG       ((uint32_t)1 << 20)//高电平警报有效标志
#define GPAI_CHnCR_FIFO_ERR       ((uint32_t)1 << 17)//FIFO 异常标志，上下溢出
#define GPAI_CHnCR_DRDY           ((uint32_t)1 << 16)//数据有效标志,表示FIFO数据有效
#define GPAI_CHnCR_LLAR_INTEN     ((uint32_t)1 << 7)//低电平警报解除中断1使能
#define GPAI_CHnCR_LLAV_INTEN     ((uint32_t)1 << 6)//低电平警报有效中断1使能
#define GPAI_CHnCR_HLAR_INTEN     ((uint32_t)1 << 5)//高电平警报解除中断1使能
#define GPAI_CHnCR_HLAV_INTEN     ((uint32_t)1 << 4)//高电平警报有效中断1使能
#define GPAI_CHnCR_FIFO_INTEN     ((uint32_t)1 << 1)//FIFO 异常中断1使能
#define GPAI_CHnCR_DRDY_INTEN     ((uint32_t)1 << 0)//数据有效中断使能
//GPAI 通道采样间隔配置 (GPAI Channel N Periodic Sample Interval)
#define GPAI_CHnCR_PSI_MASK       0x0FFFFFFF
#define GPAI_CHnCR_PSI_DEFAULT    0x0005DC0
//GPAI 高电平报警阈值 (Channel N High-Level Alarm Threshold)
#define GPAI_CHnCR_HLARV_SHIFT       16  //高电平报警解除阈值
#define GPAI_CHnCR_HLARV_MASK ((uint32_t)0xFFF << 16) 
#define GPAI_CHnCR_HLAVV_MASK ((uint32_t)0xFFF)//高电平报警有效阈值
//GPAI 低电平报警阈值 (Channel N Low-Level Alarm Threshold)
#define GPAI_CHnCR_LLARV_SHIFT       16  //低电平报警解除阈值
#define GPAI_CHnCR_LLARV_MASK ((uint32_t)0xFFF << 16) 
#define GPAI_CHnCR_LLAVV_MASK ((uint32_t)0xFFF)//低电平报警有效阈值
//GPAI 报警控制 (GPAI Alarm Control Register)
#define GPAI_CHnCR_NLD_DIS     ((uint32_t)1 << 6)//丢弃正常电平的采样数据
#define GPAI_CHnCR_LLD_DIS     ((uint32_t)1 << 5)//丢弃低电平的采样数据
#define GPAI_CHnCR_HLD_DIS     ((uint32_t)1 << 4)//丢弃高电平的采样数据
#define GPAI_CHnCR_LLA_EN      ((uint32_t)1 << 1)//低电平报警使能
#define GPAI_CHnCR_HLA_EN      ((uint32_t)1 << 0)//高电平报警使能
//GPAI FIFO 控制 (GPAI Channel N FIFO Control Register)
#define GPAI_CHnCR_FIFO_DCNT_SHIRT 24//FIFO 有效数据量
#define GPAI_CHnCR_FIFO_DCNT_MASK ((uint32_t)0x7F << 24) 
#define GPAI_CHnCR_FIFO_UFS      ((uint32_t)0 << 18)//FIFO下溢出,硬件置位，软件写1清零
#define GPAI_CHnCR_FIFO_OFS      ((uint32_t)0 << 17)//FIFO上溢出,硬件置位，软件写1清零
#define GPAI_CHnCR_FIFO_DRTH_SHIRT  8  //FIFO 数据有效阈值，到此会产生中断
#define GPAI_CHnCR_FIFO_DRTH_MASK ((uint32_t)0xFF << 8)
#define GPAI_CHnCR_FIFO_FLUSH    ((uint32_t)1 << 0)//FIFO 清空操作 (FIFO Flush)
//GPAI 通道数据 (GPAI Channel N Data)
#define GPAI_CHnCR_FIFO_DATA_MASK ((uint32_t)0xFFF)

#endif //__AIC_SOC_EX_H_
